package com.zmzncs.lmtc.common.util;

import lombok.extern.slf4j.Slf4j;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.List;
import java.util.Properties;


/**
 * @Author 高博文
 * @Date 2021/06/04 14:53
 */
@Slf4j
public class EmailUtil {

    // 发件人的 邮箱 和 密码
    // 对于开启了独立密码（有的邮箱称为“授权码”）的邮箱, 这里的邮箱密码必需使用这个独立密码（授权码）。
    private static final String emailAccount = "zmzncs@163.com";
    private static final String emailPassword = "BKAHXNUDBZPIQWHC"; //授权码
    private static final String emailSMTPHost = "smtp.163.com";
    // SMTP 服务器的端口
    private static final String smtpPort = "465";



    /**
     * 创建一封只包含文本的简单邮件
     *
     * @param session     和服务器交互的会话
     * @param sendEmailList  收件人邮箱集合
     * @param content 邮件正文
     * @return
     * @throws Exception
     */
    private static MimeMessage createMimeMessage(Session session, List<String> sendEmailList, String content) throws Exception {
        // 1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);
        // 2. From: 发件人
        message.setFrom(new InternetAddress(emailAccount, "中萌智能城市发展建设有限公司", "UTF-8"));
        // 3. To: 收件人
        for (int i = 0; i < sendEmailList.size(); i++) {
            if (i == 0){
                message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(sendEmailList.get(i), "USER_" + i, "UTF-8"));
            } else {
                message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress(sendEmailList.get(i), "USER_" + i, "UTF-8"));
            }
        }
        // 4. Subject: 邮件主题
        message.setSubject("主题", "UTF-8");
        // 5. Content: 邮件正文（可以使用html标签）
        message.setContent(content, "text/html;charset=UTF-8");
        // 6. 设置发件时间
        message.setSentDate(new Date());
        // 7. 保存设置
        message.saveChanges();

        return message;
    }

    /**
     * 发送邮件
     * @param sendEmailList 收件人邮箱集合
     * @param content 邮件正文
     * @throws Exception
     */
    public static void sendEmail(List<String> sendEmailList,String content) throws Exception {

        // 1. 创建参数配置, 用于连接邮件服务器的参数配置
        Properties props = new Properties();                    // 参数配置
        props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议（JavaMail规范要求）
        props.setProperty("mail.smtp.host", emailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
        props.setProperty("mail.smtp.auth", "true");            // 需要请求认证
        props.setProperty("mail.smtp.port", smtpPort);
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.socketFactory.port", smtpPort);

        // 2. 根据配置创建会话对象, 用于和邮件服务器交互
        Session session = Session.getInstance(props);
        // 设置为debug模式, 可以查看详细的发送 log
//        session.setDebug(true);

        // 3. 创建一封邮件
        MimeMessage message = createMimeMessage(session, sendEmailList, content);

        // 4. 根据 Session 获取邮件传输对象
        Transport transport = session.getTransport();

        // 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错
        transport.connect(emailAccount, emailPassword);

        // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
        transport.sendMessage(message, message.getAllRecipients());

        // 7. 关闭连接
        transport.close();
    }


}
